package com.zxy.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.zxy.mapper.ActivityMapper;
import com.zxy.pojo.dto.ActivityListQuery;
import com.zxy.pojo.entity.Activity;
import com.zxy.pojo.entity.ActivityDict;
import com.zxy.pojo.vo.ActivityCreateVO;
import com.zxy.pojo.vo.ActivityDictResponseVO;
import com.zxy.pojo.vo.ActivityPageVO;
import com.zxy.pojo.vo.ActivityResponseVO;
import com.zxy.pojo.vo.ActivityStatsVO;
import com.zxy.service.ActivityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/**
 * 活动管理Service实现
 */
@Service
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> implements ActivityService {

    // 时间格式器：匹配前端传递的"yyyy-MM-dd HH:mm"（如"2025-09-24 00:00"）
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

    @Autowired
    private ActivityMapper activityMapper;

    @Override
    public ActivityPageVO getActivityList(ActivityListQuery query) {
        // 1. 构建分页对象（使用DTO的默认值：pageNum=1，pageSize=10）
        Page<Activity> page = new Page<>(query.getPageNum(), query.getPageSize());

        // 2. 执行分页查询（带多条件筛选）
        IPage<Activity> activityPage = activityMapper.selectActivityPage(page, query);

        // 3. 查询统计参数（params字段）
        ActivityStatsVO statsVO = activityMapper.selectActivityStats();

        // 4. 封装返回VO（与需求格式完全一致）
        ActivityPageVO pageVO = new ActivityPageVO();
        pageVO.setTotal((int) activityPage.getTotal()); // 总记录数（long转int适配返回格式）
        pageVO.setRows(activityPage.getRecords());      // 分页数据列表
        pageVO.setParams(statsVO);                      // 统计参数

        return pageVO;
    }

    /**
     * 通用方法：根据字典类型查询列表
     * @param dictType 字典类型（如clues_item/channel_type/activity_status）
     * @return 统一返回格式VO
     */
    @Override
    public ActivityDictResponseVO getDictListByType(String dictType) {
        // 1. 调用通用Mapper，查询对应类型的字典数据
        List<ActivityDict> dictList = activityMapper.selectDictListByType(dictType);

        // 2. 处理"default"字段：isDefault=N→false（与所有接口返回一致）
        dictList.forEach(dict -> dict.setDefaultFlag("Y".equals(dict.getIsDefault())));

        // 3. 封装返回VO（格式统一）
        ActivityDictResponseVO responseVO = new ActivityDictResponseVO();
        responseVO.setData(dictList);

        return responseVO;
    }


    @Override
    public ActivityResponseVO createActivity(ActivityCreateVO createVO) {
        // 1. 解析activityTime为LocalDateTime（开始时间和结束时间）
        String beginTimeStr = createVO.getBeginTimeStr().trim();
        String endTimeStr = createVO.getEndTimeStr().trim();
        
        // 确保时间字符串格式正确（补充可能缺失的秒部分）
        if (beginTimeStr.length() == 16) { // "yyyy-MM-dd HH:mm" format
            beginTimeStr += ":00"; // 补充秒部分
        }
        if (endTimeStr.length() == 16) { // "yyyy-MM-dd HH:mm" format
            endTimeStr += ":00"; // 补充秒部分
        }
        
        LocalDateTime beginTime = LocalDateTime.parse(beginTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        LocalDateTime endTime = LocalDateTime.parse(endTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        // 2. 业务校验：开始时间不能晚于结束时间
        Assert.isTrue(beginTime.isBefore(endTime), "活动开始时间不能晚于结束时间");

        // 3. 转换：请求VO → 数据库实体（赋值所有字段）
        Activity activity = new Activity();
        activity.setId(null); // 显式设置ID为null，让数据库处理自增
        activity.setCode(generateActivityCode()); // 生成活动编码
        activity.setName(createVO.getName());
        activity.setInfo(createVO.getInfo());
        activity.setChannel(createVO.getChannel()); // 字典选择的渠道值（如"0"）
        activity.setType(createVO.getType());       // 字典选择的类型值（如"1"）
        // 类型转换：BigDecimal → Double
        BigDecimal discount = createVO.getDiscount();
        activity.setDiscount(discount != null ? discount.doubleValue() : null);
        activity.setBeginTime(beginTime);           // 解析后的开始时间
        activity.setEndTime(endTime);               // 解析后的结束时间
        activity.setStatus("2");   // 默认状态为2（已通过）

        // 4. 插入数据库（MyBatis-Plus的BaseMapper提供insert方法）
        baseMapper.insert(activity);

        // 5. 返回成功响应
        return ActivityResponseVO.success();
    }

    /**
     * 生成活动编码
     * @return 活动编码字符串
     */
    private String generateActivityCode() {
        // 生成类似pa35elxs格式的8位活动编码
        String chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder code = new StringBuilder();
        java.util.Random random = new java.util.Random();
        
        for (int i = 0; i < 8; i++) {
            code.append(chars.charAt(random.nextInt(chars.length())));
        }
        
        return code.toString();
    }
}